package com.example.demo.WxMessage;

/**
 * @Author: gc
 * @Date: 2023/8/22 15:02
 * @explain:
 **/
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 发送模板消息
 */
@RestController
public class PushWxMessage {


    /*
     * 微信测试账号 批量 循环推送 模板消息
     */
    @PostMapping("/weChatPush")
    public String weChatPush() {
        try {
            List<String> ls = getOpenId(getAccessToken());
            for (int i=0;i<ls.size();i++){
                System.out.println(ls.get(i));
                push(ls.get(i),"","");
            }
            return ("推送成功");
        }catch (Exception e){
            e.printStackTrace();
            return ("推送失败");
        }
    }

    /*
     * 微信测试账号 发送模板消息
     */
    @PostMapping("/push")
    public Object push(String openid, String template_id, String jumpurl) {

        RestTemplate restTemplate = new RestTemplate();
        //为了简单测试 这里每次都获取最新的access_token（在实际开发中，应该在 access_token 快过期时再重新获取）
        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + getAccessToken();
        //推送的模版 （目前为了简单测试 很多参数都写死,固定了,但也可以根据需要动态传入参数）
        WxTemplate wxTe = new WxTemplate();
        wxTe.setTouser(openid);//用户的openid（接收人，这里应该传进来的）
        wxTe.setTemplate_id("你拿到的 模板id");//订阅消息模板id
        wxTe.setUrl("www.baidu.com");//跳转链接

        //日期格式定义 转换
        DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String dateString = dateformat.format(new Date());

        Map<String, TemplateData> m = new HashMap<>();
        m.put("title", new TemplateData("测试推送：收费通知！","#F7A36F"));
        m.put("content", new TemplateData("即将要欠费，你要交钱了！","#79CCE9"));
        m.put("time", new TemplateData(dateString,"#79CCE9"));
        m.put("remark", new TemplateData("多交点！少费事！","#FF0000"));
        wxTe.setData(m);

        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxTe, String.class);
        return JSON.parseObject(responseEntity.getBody());
    }

    /*
     * 获取 access_token（接口调用凭据）
     */
    @GetMapping("/getAccessToken")
    public String getAccessToken() {
        RestTemplate restTemplate = new RestTemplate();
        Map<String, String> params = new HashMap<>();
        params.put("APPID", "你拿到的 appid");  //
        params.put("APPSECRET", "你拿到的 appsecret");  //
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
        String body = responseEntity.getBody();
        JSONObject object = JSON.parseObject(body);
        String Access_Token = object.getString("access_token");
        String expires_in = object.getString("expires_in");// 过期时长（两小时）
        //System.out.println("有效时长expires_in：" + expires_in);
        return Access_Token;
    }

    /*
     * 获取 openid（关注者列表）
     */
    @GetMapping("/getOpenId")
    public List<String> getOpenId(String access_token) {
        RestTemplate restTemplate = new RestTemplate();
        Map<String, String> params = new HashMap<>();
        params.put("access_token", access_token);  //
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                "https://api.weixin.qq.com/cgi-bin/user/get?access_token={access_token}", String.class, params
        );

        String body = responseEntity.getBody();
        // 解析成JSONObject 并获取（叫data的JSON对象）JSONObject
        JSONObject object = JSON.parseObject(body).getJSONObject("data");
        // 获取 JSONObject 中的 JSONArray
        JSONArray array = object.getJSONArray("openid");

        System.out.println("array"+array);
        // JSONArray 转成 List<Strig> 集合（注意 alibaba 的fastjson 1.2.23以下的版本 和 1.2.3 的版本不包含 toJavaList()方法 ）
//        List<String> lists = array.toArrayList(String.class);
//        System.out.println(lists.get(0));
//
        return null;
    }

    /*
     * 发送模板消息
     */
    @PostMapping("/jsonpush")
    public Object jsonpush(@RequestBody Map<String, Object> map) {

        System.out.println(map);
        RestTemplate restTemplate = new RestTemplate();
        //为了简单测试 这里每次都获取最新的access_token（在实际开发中，应该在 access_token 快过期时再重新获取）
        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + getAccessToken();

//        //日期格式定义 转换
//        DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//        String dateString = dateformat.format(new Date());//当前时间
//
//        //也可以定义为 JSONObject 类型来进行追加
//        Map<String, Object> data = (Map<String, Object>) map.get("data");// 获取data对象 转为Map集合
//        Map<String, String> time = new HashMap<String, String>();// 定义一个叫time的Map集合
//        //逐层追加
//        time.put("value",dateString);
//        time.put("color","#02ABE4");
//        data.put("time",time);
//        map.put("data",data);

        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
        return JSON.parseObject(responseEntity.getBody());
    }

}